package limeirafol.bean;

import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;
import limeirafol.remote.cadastro.AcessorioFiltroConsultaVO;
import limeirafol.remote.cadastro.AcessorioVO;
import limeirafol.remote.cadastro.BanhoFiltroConsultaVO;
import limeirafol.remote.cadastro.BanhoVO;
import limeirafol.remote.cadastro.FornecedorFiltroConsultaVO;
import limeirafol.remote.cadastro.FornecedorVO;
import limeirafol.remote.cadastro.MunicipioFiltroConsultaVO;
import limeirafol.remote.cadastro.MunicipioVO;
import limeirafol.remote.cadastro.ProdutoFiltroConsultaVO;
import limeirafol.remote.cadastro.ProdutoItemVO;
import limeirafol.remote.cadastro.ProdutoVO;
import limeirafol.remote.cadastro.Situacao;
import limeirafol.remote.cadastro.TipoInscricao;
import lbframework.classe.Conexao;
import lbframework.classe.Util;
import lbframework.classe.LBException;
import limeirafol.Global;
import limeirafol.remote.Formulario;
import limeirafol.remote.TipoOperacao;
import limeirafol.remote.UsuarioVO;
import limeirafol.remote.cadastro.ClienteFiltroConsultaVO;
import limeirafol.remote.cadastro.ClienteVO;
import limeirafol.remote.cadastro.PermissaoVO;
import limeirafol.remote.cadastro.UsuarioFiltroConsultaVO;

public class BeanCadastro {

    public Vector<MunicipioVO> consultarMunicipio(MunicipioFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT m.*, e.sigla AS estado");
        sql.append(" FROM municipio AS m");
        sql.append(" INNER JOIN estado AS e ON e.id = m.id_estado");
        sql.append(" WHERE 1 = 1");

        if (!i_filtro.descricao.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("m.descricao", i_filtro.descricao));
        }

        if (i_filtro.idEstado != -1) {
            sql.append(" AND m.id_estado = " + i_filtro.idEstado);
        }

        sql.append("ORDER BY m.descricao");

        rst = stm.executeQuery(sql.toString());

        Vector<MunicipioVO> vMunicipio = new Vector();

        while (rst.next()) {
            MunicipioVO oMunicipio = new MunicipioVO();
            oMunicipio.id = rst.getInt("id");
            oMunicipio.descricao = rst.getString("descricao");
            oMunicipio.estado = rst.getString("estado");

            vMunicipio.add(oMunicipio);
        }

        stm.close();

        return vMunicipio;
    }

    public void salvarFornecedor(FornecedorVO i_fornecedor) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        //salva fornecedor
        rst = stm.executeQuery("SELECT id FROM fornecedor WHERE id = " + i_fornecedor.id + " AND id > 0");

        if (rst.next()) {
            Global.verificarPermissao(Formulario.FORNECEDOR, TipoOperacao.ALTERAR);
            sql = new StringBuilder();
            sql.append("UPDATE fornecedor SET");
            sql.append(" razaosocial = '" + i_fornecedor.razaoSocial + "',");
            sql.append(" nomefantasia = '" + i_fornecedor.nomeFantasia + "',");
            sql.append(" endereco = '" + i_fornecedor.endereco + "',");
            sql.append(" numero = '" + i_fornecedor.numero + "',");
            sql.append(" bairro = '" + i_fornecedor.bairro + "',");
            sql.append(" id_municipio = " + i_fornecedor.id_municipio + ",");
            sql.append(" cep = '" + i_fornecedor.cep + "',");
            sql.append(" id_estado = " + i_fornecedor.id_estado + ",");
            sql.append(" telefone = '" + i_fornecedor.telefone + "',");
            sql.append(" id_tipoinscricao = " + i_fornecedor.id_tipoinscricao + ",");
            sql.append(" inscricaoestadual = '" + i_fornecedor.inscricao + "',");
            sql.append(" cnpj = '" + i_fornecedor.cnpj + "',");
            sql.append(" id_situacaocadastro = " + i_fornecedor.id_situacao);
            sql.append(" WHERE id = " + i_fornecedor.id);

            stm.execute(sql.toString());

        } else {
            Global.verificarPermissao(Formulario.FORNECEDOR, TipoOperacao.INCLUIR);
            stm = Conexao.createStatement();

            sql = new StringBuilder();
            sql.append("INSERT INTO fornecedor (razaosocial, nomefantasia, id_situacaocadastro, endereco, numero, cep,");
            sql.append(" bairro, id_municipio, id_estado, telefone, id_tipoinscricao,");
            if (i_fornecedor.id_tipoinscricao == TipoInscricao.FISICA.getId()) {
                sql.append(" cpf, rg)");
            } else {
                sql.append("cnpj, inscricaoestadual)");
            }
            sql.append(" VALUES (");
            sql.append("'" + i_fornecedor.razaoSocial + "', ");
            sql.append("'" + i_fornecedor.nomeFantasia + "', ");
            sql.append(i_fornecedor.id_situacao + ", ");
            sql.append("'" + i_fornecedor.endereco + "', ");
            sql.append(i_fornecedor.numero + ", ");
            sql.append("'" + i_fornecedor.cep + "', ");
            sql.append("'" + i_fornecedor.bairro + "', ");
            sql.append(i_fornecedor.id_municipio + ", ");
            sql.append(i_fornecedor.id_estado + ", ");
            sql.append("'" + i_fornecedor.telefone + "', ");
            sql.append(i_fornecedor.id_tipoinscricao + ", ");
            sql.append("'" + i_fornecedor.cnpj + "', ");
            sql.append("'" + i_fornecedor.inscricao + "'); ");

            stm.execute(sql.toString());
        }
    }

    public FornecedorVO carregarFornecedor(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT f.*, municipio.descricao AS municipio, estado.sigla AS estado");
        sql.append(" FROM fornecedor AS f");
        sql.append(" INNER JOIN municipio ON municipio.id = f.id_municipio");
        sql.append(" INNER JOIN estado ON estado.id = municipio.id_estado");
        sql.append(" WHERE f.id = " + i_id);

        rst = stm.executeQuery(sql.toString());


        if (!rst.next()) {
            throw new LBException("Fornecedor não encontrado!");
        }

        FornecedorVO oFornecedor = new FornecedorVO();
        oFornecedor.id = rst.getInt("id");
        oFornecedor.razaoSocial = rst.getString("razaosocial");
        oFornecedor.nomeFantasia = rst.getString("nomefantasia");
        oFornecedor.id_situacao = rst.getInt("id_situacaocadastro");
        oFornecedor.endereco = rst.getString("endereco");
        oFornecedor.bairro = rst.getString("bairro");
        oFornecedor.cep = rst.getString("cep");
        oFornecedor.numero = rst.getString("numero");
        oFornecedor.id_municipio = rst.getInt("id_municipio");
        oFornecedor.municipio = rst.getString("municipio");
        oFornecedor.id_estado = rst.getInt("id_estado");
        oFornecedor.estado = rst.getString("estado");
        oFornecedor.telefone = rst.getString("telefone");
        oFornecedor.id_tipoinscricao = rst.getInt("id_tipoinscricao");

        if (oFornecedor.id_tipoinscricao == TipoInscricao.FISICA.getId()) {
            oFornecedor.cnpj = rst.getString("cpf");
            oFornecedor.inscricao = rst.getString("rg");
        }
        if (oFornecedor.id_tipoinscricao == TipoInscricao.JURIDICA.getId()) {
            oFornecedor.cnpj = rst.getString("cnpj");
            oFornecedor.inscricao = rst.getString("inscricaoestadual");
        }

        stm.close();
        return oFornecedor;
    }

    public Vector<FornecedorVO> consultarFornecedor(FornecedorFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();

        sql.append("SELECT f.id, f.razaosocial, f.nomefantasia, f.endereco, f.bairro, f.numero, m.descricao AS municipio,");
        sql.append(" f.cep, COALESCE(e.sigla, eant.sigla) AS estado, f.telefone, ti.descricao AS tipoinscricao, f.inscricaoestadual AS inscricao, f.cpf,");
        sql.append(" f.cnpj, f.rg, sc.descricao AS situacaocadastro, f.id_tipoinscricao, ti.descricao AS tipoinscricao");
        sql.append(" FROM fornecedor AS f");
        sql.append(" LEFT JOIN municipio AS m ON m.id = f.id_municipio");
        sql.append(" LEFT JOIN estado AS e ON e.id = m.id_estado");
        sql.append(" LEFT JOIN estado AS eant ON eant.id = f.id_estado");
        sql.append(" INNER JOIN tipoinscricao AS ti ON ti.id = f.id_tipoinscricao");
        sql.append(" INNER JOIN situacaocadastro AS sc ON sc.id = f.id_situacaocadastro");
        sql.append(" WHERE 1 = 1 ");

        if (i_filtro.id > 0) {
            sql.append(" AND f.id = " + i_filtro.id);
        }

        if (i_filtro.idSituacaoCadastro != -1) {
            sql.append(" AND f.id_situacaocadastro = " + i_filtro.idSituacaoCadastro);
        }

        if (!i_filtro.nomeFantasia.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("f.nomefantasia", i_filtro.nomeFantasia));
        }

        if (!i_filtro.razaoSocial.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("f.razaosocial", i_filtro.razaoSocial));
        }

        sql.append(" ORDER BY f.razaosocial");

        if (i_filtro.limite > 0) {
            sql.append(" LIMIT " + i_filtro.limite);
        }

        rst = stm.executeQuery(sql.toString());

        Vector<FornecedorVO> vFornecedor = new Vector();

        while (rst.next()) {
            FornecedorVO oFornecedor = new FornecedorVO();
            oFornecedor.id = rst.getInt("id");
            oFornecedor.razaoSocial = rst.getString("razaosocial");
            oFornecedor.nomeFantasia = rst.getString("nomefantasia");
            oFornecedor.endereco = rst.getString("endereco");
            oFornecedor.numero = rst.getString("numero");
            oFornecedor.bairro = rst.getString("bairro");
            oFornecedor.municipio = rst.getString("municipio");
            oFornecedor.cep = rst.getString("cep");
            oFornecedor.tipoinscricao = rst.getString("tipoinscricao");
            oFornecedor.id_tipoinscricao = rst.getInt("id_tipoinscricao");

            if (oFornecedor.id_tipoinscricao == TipoInscricao.FISICA.getId()) {
                oFornecedor.inscricao = rst.getString("cpf");
                oFornecedor.cnpj = rst.getString("rg");
            }
            if (oFornecedor.id_tipoinscricao == TipoInscricao.JURIDICA.getId()) {
                oFornecedor.cnpj = rst.getString("cnpj");
                oFornecedor.inscricao = rst.getString("inscricao");
            }
            oFornecedor.estado = rst.getString("estado");
            oFornecedor.telefone = rst.getString("telefone");
            oFornecedor.situacao = rst.getString("situacaocadastro");



            vFornecedor.add(oFornecedor);
        }

        stm.close();

        return vFornecedor;
    }

    public void excluirFornecedor(int i_id) throws Exception {
        Statement stm = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();

            stm.execute("UPDATE fornecedor SET id_situacaocadastro = " + Situacao.EXCLUIDO.getId() + " WHERE id = " + i_id);

            stm.close();
            Conexao.commit();

        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public void salvarAcessorio(AcessorioVO i_acessorio) throws Exception {

        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();

        sql.append("SELECT * FROM acessorios WHERE id = " + i_acessorio.id);
        rst = stm.executeQuery(sql.toString());

        if (rst.next()) {
            Global.verificarPermissao(Formulario.ACESSORIOS, TipoOperacao.ALTERAR);
            sql = new StringBuilder();
            sql.append("UPDATE acessorios SET");
            sql.append(" codigointerno = '" + i_acessorio.codigoInterno + "', ");
            sql.append(" descricao = '" + i_acessorio.descricao + "', ");
            sql.append(" codigoexterno = '" + i_acessorio.codigoExterno + "', ");
            sql.append(" id_fornecedor = " + i_acessorio.id_fornecedor + ", ");
            sql.append(" estoqueminimo = " + i_acessorio.estoqueMinimo + ", ");
            sql.append(" estoquemaximo = " + i_acessorio.estoqueMaximo + ", ");
            sql.append(" pesounitario = " + i_acessorio.pesoUnitario + ", ");
            sql.append(" precounitario = " + i_acessorio.custoUnitario + ", ");
            sql.append(" foto = '" + i_acessorio.foto + "', ");
            sql.append(" id_situacaocadastro = " + i_acessorio.id_situacaocadatro + ", ");
            sql.append(" id_tipoembalagem = " + i_acessorio.id_tipoEmbalagem + ", ");
            sql.append(" id_tipoacessorio = " + i_acessorio.id_tipoacessorio);
            sql.append(" WHERE id = " + i_acessorio.id);

            stm.execute(sql.toString());

        } else {
            Global.verificarPermissao(Formulario.ACESSORIOS, TipoOperacao.INCLUIR);
            //Verifica código Interno
            stm = Conexao.createStatement();
            sql = new StringBuilder();
            sql.append("SELECT * FROM acessorios WHERE codigointerno = '" + i_acessorio.codigoInterno + "'");
            rst = stm.executeQuery(sql.toString());

            if (rst.next()) {
                throw new LBException("Código Interno já cadastrado");
            }

            sql = new StringBuilder();
            sql.append("INSERT INTO acessorios (codigointerno, descricao, codigoexterno,");
            sql.append(" id_fornecedor, estoqueminimo, estoquemaximo, pesounitario, precounitario, foto,");
            sql.append(" id_situacaocadastro, id_tipoEmbalagem, id_tipoacessorio)");
            sql.append(" VALUES (");
            sql.append("'" + i_acessorio.codigoInterno + "', ");
            sql.append("'" + i_acessorio.descricao + "', ");
            sql.append("'" + i_acessorio.codigoExterno + "', ");
            sql.append(i_acessorio.id_fornecedor + ", ");
            sql.append(i_acessorio.estoqueMinimo + ", ");
            sql.append(i_acessorio.estoqueMaximo + ", ");
            sql.append(i_acessorio.pesoUnitario + ", ");
            sql.append(i_acessorio.custoUnitario + ", ");
            sql.append("'" + i_acessorio.foto + "', ");
            sql.append(i_acessorio.id_situacaocadatro + ", ");
            sql.append(i_acessorio.id_tipoEmbalagem + ", ");
            sql.append(i_acessorio.id_tipoacessorio + ");");

            stm.execute(sql.toString());
        }
    }

    public AcessorioVO carregarAcessorio(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT a.*, fornecedor.razaosocial AS fornecedor");
        sql.append(" FROM acessorios AS a");
        sql.append(" INNER JOIN fornecedor ON fornecedor.id = a.id_fornecedor");
        sql.append(" WHERE a.id = " + i_id);

        rst = stm.executeQuery(sql.toString());

        if (!rst.next()) {
            throw new LBException("Acessório não encontrado!");
        }

        AcessorioVO oAcessorio = new AcessorioVO();
        oAcessorio.id = rst.getInt("id");
        oAcessorio.codigoInterno = rst.getString("codigointerno");
        oAcessorio.descricao = rst.getString("descricao");
        oAcessorio.codigoExterno = rst.getString("codigoexterno");
        oAcessorio.id_fornecedor = rst.getInt("id_fornecedor");
        oAcessorio.estoqueMinimo = rst.getDouble("estoqueminimo");
        oAcessorio.estoqueMaximo = rst.getDouble("estoquemaximo");
        oAcessorio.pesoUnitario = rst.getDouble("pesounitario");
        oAcessorio.custoUnitario = rst.getDouble("precounitario");
        oAcessorio.foto = rst.getString("foto");
        oAcessorio.id_tipoacessorio = rst.getInt("id_tipoacessorio");
        oAcessorio.id_situacaocadatro = rst.getInt("id_situacaocadastro");
        oAcessorio.id_tipoEmbalagem = rst.getInt("id_tipoembalagem");

        stm.close();

        return oAcessorio;
    }

    public Vector<AcessorioVO> consultarAcessorio(AcessorioFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();

        sql.append(" SELECT a.id, a.codigointerno, a.descricao, a.codigoexterno, f.razaosocial AS fornecedor,");
        sql.append(" a.estoqueminimo, a.estoquemaximo, a.pesounitario, a.precounitario, sc.descricao AS situacao, ta.descricao AS tipoacessorio,");
        sql.append(" a.foto AS foto, te.descricao AS tipoembalagem, a.id_tipoembalagem AS id_tipoembalagem");
        sql.append(" FROM acessorios AS a");
        sql.append(" INNER JOIN fornecedor AS f ON f.id = a.id_fornecedor");
        sql.append(" INNER JOIN situacaocadastro AS sc ON sc.id = a.id_situacaocadastro");
        sql.append(" INNER JOIN tipoacessorio AS ta ON ta.id = a.id_tipoacessorio");
        sql.append(" INNER JOIN tipoembalagem AS te ON te.id = a.id_tipoembalagem");
        sql.append(" WHERE 1 = 1 ");

        if (i_filtro.id > 0) {
            sql.append(" AND a.id = " + i_filtro.id);
        }
        if (!i_filtro.codigoInterno.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("a.codigointerno", i_filtro.codigoInterno));
        }
        if (!i_filtro.codigoExterno.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("a.codigoexterno", i_filtro.codigoExterno));
        }
        if (!i_filtro.descricao.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("a.descricao", i_filtro.descricao));
        }
        if (i_filtro.id_tipoacessorio != -1) {
            sql.append(" AND a.id_tipoacessorio = " + i_filtro.id_tipoacessorio);
        }
        if (i_filtro.id_situacaoCadastro != -1) {
            sql.append(" AND a.id_situacaocadastro = " + i_filtro.id_situacaoCadastro);
        }

        sql.append(" ORDER BY a.descricao");

        if (i_filtro.limite > 0) {
            sql.append(" LIMIT " + i_filtro.limite);
        }

        rst = stm.executeQuery(sql.toString());

        Vector<AcessorioVO> vAcessorio = new Vector();

        while (rst.next()) {
            AcessorioVO oAcessorio = new AcessorioVO();
            oAcessorio.id = rst.getInt("id");
            oAcessorio.codigoInterno = rst.getString("codigointerno");
            oAcessorio.descricao = rst.getString("descricao");
            oAcessorio.codigoExterno = rst.getString("codigoexterno");
            oAcessorio.fornecedor = rst.getString("fornecedor");
            oAcessorio.estoqueMinimo = rst.getDouble("estoqueminimo");
            oAcessorio.estoqueMaximo = rst.getDouble("estoquemaximo");
            oAcessorio.pesoUnitario = rst.getDouble("pesounitario");
            oAcessorio.custoUnitario = rst.getDouble("precounitario");
            oAcessorio.tipoAcessorio = rst.getString("tipoacessorio");
            oAcessorio.situacaoCadastro = rst.getString("situacao");
            oAcessorio.tipoEmbalagem = rst.getString("tipoembalagem");
            oAcessorio.id_tipoEmbalagem = rst.getInt("id_tipoembalagem");
            oAcessorio.foto = rst.getString("foto");
            vAcessorio.add(oAcessorio);
        }

        stm.close();

        return vAcessorio;
    }

    public void excluirAcessorio(int i_id) throws Exception {
        Statement stm = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();

            stm.execute("UPDATE acessorios SET id_situacaocadastro = " + Situacao.EXCLUIDO.getId() + " WHERE id = " + i_id);

            stm.close();
            Conexao.commit();

        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public void salvarBanho(BanhoVO i_banho) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();

        sql.append("SELECT * FROM banho WHERE id = " + i_banho.id + " AND id > 0");
        rst = stm.executeQuery(sql.toString());

        if (rst.next()) {
            Global.verificarPermissao(Formulario.BANHO, TipoOperacao.ALTERAR);
            sql = new StringBuilder();
            sql.append("UPDATE banho SET");
            sql.append(" descricao = '" + i_banho.descricao + "', ");
            sql.append(" sigla = '" + i_banho.sigla + "', ");
            sql.append(" id_situacaocadastro = " + i_banho.idSituacao + ", ");
            sql.append(" banhoacessorio = " + i_banho.banhoacessorio + ", ");
            sql.append(" utilizaml = " + i_banho.utilizamilesimos + ", ");
            sql.append(" precoporkilo = " + i_banho.precoporkilo);
            sql.append(" WHERE id = " + i_banho.id);

            stm.execute(sql.toString());
        } else {
            Global.verificarPermissao(Formulario.BANHO, TipoOperacao.INCLUIR);
            sql = new StringBuilder();
            sql.append("INSERT INTO banho (descricao, sigla, id_situacaocadastro, banhoacessorio, utilizaml, precoporkilo) VALUES");
            sql.append(" ('" + i_banho.descricao + "', ");
            sql.append("'" + i_banho.sigla + "', ");
            sql.append(i_banho.idSituacao + ", ");
            sql.append(i_banho.banhoacessorio + ", ");
            sql.append(i_banho.utilizamilesimos + ", ");
            sql.append(i_banho.precoporkilo + "); ");

            stm.execute(sql.toString());
        }
    }

    public BanhoVO carregarBanho(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT b.*, situacaocadastro.descricao AS situacao");
        sql.append(" FROM banho AS b");
        sql.append(" INNER JOIN situacaocadastro ON situacaocadastro.id = b.id_situacaocadastro");
        sql.append(" WHERE b.id = " + i_id);

        rst = stm.executeQuery(sql.toString());

        if (!rst.next()) {
            throw new LBException("Banho não encontrado!");
        }

        BanhoVO oBanho = new BanhoVO();
        oBanho.id = rst.getInt("id");
        oBanho.descricao = rst.getString("descricao");
        oBanho.sigla = rst.getString("sigla");
        oBanho.idSituacao = rst.getInt("id_situacaocadastro");
        oBanho.banhoacessorio = rst.getBoolean("banhoacessorio");
        oBanho.utilizamilesimos = rst.getBoolean("utilizaml");
        oBanho.precoporkilo = rst.getDouble("precoporkilo");

        stm.close();

        return oBanho;
    }

    public void excluirBanho(int i_id) throws Exception {
        Statement stm = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();

            stm.execute("UPDATE banho SET id_situacaocadastro = " + Situacao.EXCLUIDO.getId() + " WHERE id = " + i_id);

            stm.close();
            Conexao.commit();

        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public Vector<BanhoVO> consultarBanho(BanhoFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();

        sql.append(" SELECT b.id, b.descricao, b.sigla, b.id_situacaocadastro AS id_situacao, b.banhoacessorio, b.utilizaml,");
        sql.append(" b.precoporkilo, sc.descricao AS situacao");
        sql.append(" FROM banho AS b");
        sql.append(" INNER JOIN situacaocadastro AS sc ON sc.id = b.id_situacaocadastro");
        sql.append(" WHERE 1 = 1 ");

        if (i_filtro.id > 0) {
            sql.append(" AND a.id = " + i_filtro.id);
        }
        if (!i_filtro.descricao.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("b.descricao", i_filtro.descricao));
        }
        if (!i_filtro.sigla.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("b.sigla", i_filtro.sigla));
        }
        if (i_filtro.id_situacaoCadastro != -1) {
            sql.append(" AND b.id_situacaocadastro = " + i_filtro.id_situacaoCadastro);
        }
        if (i_filtro.banhoacessorio == true) {
            sql.append(" AND b.banhoacessorio = " + i_filtro.banhoacessorio);
        }
        if (i_filtro.utilizaml == true) {
            sql.append(" AND b.utilizaml = " + i_filtro.utilizaml);
        }

        sql.append(" ORDER BY b.descricao");

        rst = stm.executeQuery(sql.toString());

        Vector<BanhoVO> vBanho = new Vector();

        while (rst.next()) {
            BanhoVO oBanho = new BanhoVO();
            oBanho.id = rst.getInt("id");
            oBanho.descricao = rst.getString("descricao");
            oBanho.sigla = rst.getString("sigla");
            oBanho.situacao = rst.getString("situacao");
            oBanho.banhoacessorio = rst.getBoolean("banhoacessorio");
            oBanho.utilizamilesimos = rst.getBoolean("utilizaml");
            oBanho.precoporkilo = rst.getDouble("precoporkilo");

            vBanho.add(oBanho);
        }

        stm.close();

        return vBanho;
    }

    public BanhoVO consultaBanhoMl(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();
        sql.append(" SELECT utilizaml, precoporkilo ");
        sql.append(" FROM banho");
        sql.append(" WHERE id = " + i_id);
        rst = stm.executeQuery(sql.toString());

        BanhoVO oBanho = new BanhoVO();

        while (rst.next()) {

            oBanho.utilizamilesimos = rst.getBoolean("utilizaml");
            oBanho.precoporkilo = rst.getDouble("precoporkilo");

        }
        stm.close();

        return oBanho;
    }

    public void salvarProduto(ProdutoVO i_produto) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();
            //verifica se o produto já está cadastrado
            sql = new StringBuilder();
            sql.append("SELECT * FROM produto WHERE id = " + i_produto.id);
            rst = stm.executeQuery(sql.toString());

            //atualiza produto
            if (rst.next()) {
                Global.verificarPermissao(Formulario.PRODUTO, TipoOperacao.ALTERAR);
                sql = new StringBuilder();
                sql.append("UPDATE produto SET");
                sql.append(" codigointerno = '" + i_produto.codigoInterno + "', ");
                sql.append(" descricao = '" + i_produto.descricao + "',");
                sql.append(" id_tipobanho = " + i_produto.idBanho + ", ");
                sql.append(" id_tipoproduto = " + i_produto.idTipoProduto + ", ");
                sql.append(" pesototal = " + i_produto.pesoTotal + ", ");
                sql.append(" precobruto = " + i_produto.precoDoBruto + ", ");
                sql.append(" precobanho = " + i_produto.precoBanho + ", ");
                sql.append(" custofinal = " + i_produto.precoFinal + ", ");
                sql.append(" id_situacaocadastro = " + i_produto.idSituacaoCadastro + ", ");
                sql.append(" foto = '" + i_produto.foto + "'");
                sql.append(" WHERE id = " + i_produto.id);

                stm.execute(sql.toString());
            } else {
                Global.verificarPermissao(Formulario.PRODUTO, TipoOperacao.INCLUIR);
                //Verifica código Interno
                stm = Conexao.createStatement();
                sql = new StringBuilder();
                sql.append("SELECT * FROM produto WHERE codigointerno = '" + i_produto.codigoInterno + "'");
                rst = stm.executeQuery(sql.toString());

                if (rst.next()) {
                    throw new LBException("Código Interno já cadastrado");
                }

                sql = new StringBuilder();
                sql.append("INSERT INTO produto (codigointerno, descricao, id_tipobanho, ");
                sql.append(" id_tipoproduto, pesototal, precobruto, precobanho, custofinal, foto, id_situacaocadastro)");
                sql.append(" VALUES (");
                sql.append(" '" + i_produto.codigoInterno + "', ");
                sql.append("'" + i_produto.descricao + "', ");
                sql.append(i_produto.idBanho + ", ");
                sql.append(i_produto.idTipoProduto + ", ");
                sql.append(i_produto.pesoTotal + ", ");
                sql.append(i_produto.precoDoBruto + ", ");
                sql.append(i_produto.precoBanho + ", ");
                sql.append(i_produto.precoFinal + ", ");
                sql.append("'" + i_produto.foto + "', ");
                sql.append(i_produto.idSituacaoCadastro + ");");

                stm.execute(sql.toString());

                rst = stm.executeQuery("SELECT CURRVAL('produto_id_seq') AS id");
                rst.next();

                i_produto.id = rst.getInt("id");

            }

            stm.execute("DELETE FROM produtoitem WHERE id_produto = " + i_produto.id);

            //salvar itens
            for (ProdutoItemVO oItem : i_produto.vItem) {

                sql = new StringBuilder();
                sql.append("INSERT INTO produtoitem (id_produto, id_acessorio, id_tipoembalagem, quantidade, id_tipobanho,");
                sql.append(" pesototal, custototal) VALUES (");
                sql.append(i_produto.id + ", ");
                sql.append(oItem.idAcessorio + ", ");
                sql.append(oItem.idTipoEmbalagem + ", ");
                sql.append(oItem.quantidade + ", ");
                sql.append(oItem.idTipoBanho + ", ");
                sql.append(oItem.pesoTotal + ", ");
                sql.append(oItem.custoTotal + ")");

                stm.execute(sql.toString());
            }

            stm.close();
            Conexao.commit();
        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public ProdutoVO carregarProduto(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT *");
        sql.append(" FROM produto");
        sql.append(" WHERE id = " + i_id);

        rst = stm.executeQuery(sql.toString());

        if (!rst.next()) {
            throw new LBException("Produto não encontrada!");
        }

        ProdutoVO oProduto = new ProdutoVO();
        oProduto.id = rst.getInt("id");
        oProduto.descricao = rst.getString("descricao");
        oProduto.codigoInterno = rst.getString("codigointerno");
        oProduto.idBanho = rst.getInt("id_tipobanho");
        oProduto.idTipoProduto = rst.getInt("id_tipoproduto");
        oProduto.pesoTotal = rst.getDouble("pesototal");
        oProduto.precoBanho = rst.getDouble("precobanho");
        oProduto.precoDoBruto = rst.getDouble("precobruto");
        oProduto.precoFinal = rst.getDouble("custofinal");
        oProduto.foto = rst.getString("foto");
        oProduto.idSituacaoCadastro = rst.getInt("id_situacaocadastro");

        sql = new StringBuilder();
        sql.append("SELECT pi.*, a.pesounitario AS pesounitario, tb.sigla AS sigla, a.descricao AS acessorio, a.precounitario AS custounitario");
        sql.append(" FROM produtoitem pi");
        sql.append(" INNER JOIN acessorios AS a ON a.id = pi.id_acessorio");
        sql.append(" INNER JOIN banho AS tb ON tb.id = pi.id_tipobanho");
        sql.append(" WHERE pi.id_produto = " + i_id);
        sql.append(" ORDER BY pi.id");

        rst = stm.executeQuery(sql.toString());
        while (rst.next()) {
            ProdutoItemVO oItem = new ProdutoItemVO();
            oItem.id = rst.getInt("id");
            oItem.idAcessorio = rst.getInt("id_acessorio");
            oItem.acessorio = rst.getString("acessorio");
            oItem.idTipoEmbalagem = rst.getInt("id_tipoembalagem");
            oItem.idTipoBanho = rst.getInt("id_tipobanho");
            oItem.tipoBanho = rst.getString("sigla");
            oItem.quantidade = rst.getDouble("quantidade");
            oItem.pesoTotal = rst.getDouble("pesototal");
            oItem.custoTotal = rst.getDouble("custototal");
            oItem.custoUnitario = rst.getDouble("custounitario");
            oItem.pesoUnitario = rst.getDouble("pesounitario");

            oProduto.vItem.add(oItem);
        }

        stm.close();
        return oProduto;
    }

    public Vector<ProdutoVO> consultarProdutoSintetico(ProdutoFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT p.* , tb.sigla AS tipobanho, tp.descricao AS tipoproduto FROM produto AS p");
        sql.append(" INNER JOIN banho AS tb ON tb.id = p.id_tipobanho");
        sql.append(" INNER JOIN tipoproduto AS tp ON tp.id = p.id_tipoproduto");
        sql.append(" WHERE 1 = 1");

        if (i_filtro.id > 0) {
            sql.append(" AND p.id = " + i_filtro.id);
        }

        if (!i_filtro.codigoInterno.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("p.codigointerno", i_filtro.codigoInterno));
        }

        if (!i_filtro.descricao.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("p.descricao", i_filtro.descricao));
        }

        if (i_filtro.id_tipoproduto != -1) {
            sql.append(" AND p.id_tipoproduto = " + i_filtro.id_tipoproduto);
        }
        if (i_filtro.id_situacaoCadastro != -1) {
            sql.append(" AND p.id_situacaocadastro = " + i_filtro.id_situacaoCadastro);
        }

        sql.append(" ORDER BY p.descricao");


        rst = stm.executeQuery(sql.toString());

        Vector<ProdutoVO> vProduto = new Vector();

        while (rst.next()) {
            ProdutoVO oProduto = new ProdutoVO();
            oProduto.id = rst.getInt("id");
            oProduto.codigoInterno = rst.getString("codigointerno");
            oProduto.descricao = rst.getString("descricao");
            oProduto.banho = rst.getString("tipobanho");
            oProduto.tipoProduto = rst.getString("tipoproduto");
            oProduto.pesoTotal = rst.getDouble("pesototal");
            oProduto.precoDoBruto = rst.getDouble("precobruto");
            oProduto.precoBanho = rst.getDouble("precobanho");
            oProduto.precoFinal = rst.getDouble("custofinal");
            oProduto.foto = rst.getString("foto");

            vProduto.add(oProduto);
        }

        stm.close();

        return vProduto;
    }

    public Vector<ProdutoVO> consultarProdutoAnalitico(ProdutoFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append(" SELECT p.id AS id_produto, p.codigointerno , p.descricao AS produto, a.id_tipoembalagem AS a_tipoembalagem, tb.descricao AS banhoproduto, a.id AS id_acessorio,");
        sql.append(" a.codigointerno AS codigointernoacessorio, a.descricao AS acessorio, pi.quantidade AS qtd_Acessorio,");
        sql.append(" tp.descricao AS tipoproduto, (SELECT descricao ");
        sql.append(" FROM banho ");
        sql.append(" WHERE id = pi.id_tipobanho) AS banhoacessorio,");
        sql.append(" p.pesototal AS pesototalproduto, pi.pesototal AS pesototalacessorio, p.custofinal AS custoproduto, pi.custototal AS custoacessorio");
        sql.append(" FROM produtoitem as pi");
        sql.append(" INNER JOIN produto AS p ON p.id = pi.id_produto");
        sql.append(" INNER JOIN banho as tb ON tb.id = p.id_tipobanho");
        sql.append(" INNER JOIN acessorios AS a ON a.id = pi.id_acessorio");
        sql.append(" INNER JOIN tipoproduto AS tp ON tp.id = p.id_tipoproduto");

        if (i_filtro.id > 0) {
            sql.append(" AND p.id = " + i_filtro.id);
        }

        if (!i_filtro.codigoInterno.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("p.codigointerno", i_filtro.codigoInterno));
        }

        if (!i_filtro.descricao.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("p.descricao", i_filtro.descricao));
        }

        if (i_filtro.id_tipoproduto != -1) {
            sql.append(" AND p.id_tipoproduto = " + i_filtro.id_tipoproduto);
        }
        if (i_filtro.id_situacaoCadastro != -1) {
            sql.append(" AND p.id_situacaocadastro = " + i_filtro.id_situacaoCadastro);
        }

        sql.append(" ORDER BY p.descricao");


        rst = stm.executeQuery(sql.toString());

        Vector<ProdutoVO> vProduto = new Vector();

        while (rst.next()) {
            ProdutoVO oProduto = new ProdutoVO();
            oProduto.id = rst.getInt("id_produto");
            oProduto.codigoInterno = rst.getString("codigointerno");
            oProduto.descricao = rst.getString("produto");
            oProduto.banho = rst.getString("banhoproduto");
            oProduto.precoFinal = rst.getDouble("custoproduto");
            oProduto.tipoProduto = rst.getString("tipoproduto");
            oProduto.pesoTotal = rst.getDouble("pesototalproduto");
            oProduto.idAcessorio = rst.getInt("id_acessorio");
            oProduto.acessorio = rst.getString("acessorio");
            oProduto.codInternoAcessorio = rst.getString("codigointernoacessorio");
            oProduto.pesoAcessorio = rst.getDouble("pesototalacessorio");
            oProduto.qtdAcessorio = rst.getDouble("qtd_acessorio");
            oProduto.banhoAcessorio = rst.getString("banhoacessorio");
            oProduto.custoAcessorio = rst.getDouble("custoacessorio");
            oProduto.acessorioTipoEmbalagem = rst.getInt("a_tipoembalagem");

            vProduto.add(oProduto);
        }

        stm.close();

        return vProduto;
    }

    public void excluirProduto(int i_id) throws Exception {
        Statement stm = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();

            stm.execute("UPDATE produto SET id_situacaocadastro = " + Situacao.EXCLUIDO.getId() + " WHERE id = " + i_id);

            stm.close();
            Conexao.commit();

        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public UsuarioVO autenticarUsuario(String i_usuario, String i_senha) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        try {
            stm = Conexao.createStatement();

            UsuarioVO oUsuario = new UsuarioVO();

            if (Global.isSenhaEspecial(i_usuario, i_senha)) {
                oUsuario.nome = "LUCAS BATISTA";
                oUsuario.id = 0;

            } else {
                sql = new StringBuilder();
                sql.append("SELECT id, nome FROM usuario");
                sql.append(" WHERE login = '" + i_usuario + "' AND senha = md5('" + i_senha + "')");
                sql.append(" AND id_situacaocadastro = " + Situacao.ATIVO.getId());

                rst = stm.executeQuery(sql.toString());

                if (!rst.next()) {
                    throw new LBException("Usuário e/ou senha inválido(s)");
                }

                oUsuario.id = rst.getInt("id");
                oUsuario.nome = rst.getString("nome");

                sql = new StringBuilder();
                sql.append("UPDATE usuario SET");
                sql.append(" datahoraultimoacesso = '" + Util.formatDataHoraBanco(Util.getDataHoraAtual()) + "'");
                sql.append(" WHERE id = " + oUsuario.id);

                stm.execute(sql.toString());
            }

            stm.close();

            return oUsuario;

        } catch (Exception ex) {
            throw ex;
        }
    }

    public void salvarUsuario(UsuarioVO i_usuario) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();

            //verifica login cadastrado
            sql = new StringBuilder();
            sql.append("SELECT id FROM usuario");
            sql.append(" WHERE login = '" + i_usuario.login + "'");
            sql.append(" AND id <> " + i_usuario.id);

            rst = stm.executeQuery(sql.toString());

            if (rst.next()) {
                throw new LBException("Login já cadastrado para o usuário " + rst.getInt("id") + "!");
            }

            //salva usuario
            sql = new StringBuilder();
            sql.append("SELECT id FROM usuario WHERE id = " + i_usuario.id + " AND id > 0");

            rst = stm.executeQuery(sql.toString());

            if (rst.next()) {
                //Global.verificarPermissao(Formulario.CADASTRO_USUARIO, TipoOperacao.ALTERAR);

                sql = new StringBuilder();
                sql.append("UPDATE usuario SET");
                sql.append(" login = '" + i_usuario.login + "',");
                sql.append(" nome = '" + i_usuario.nome + "',");
                sql.append(" senha = '" + i_usuario.senha + "',");
                sql.append(" id_situacaocadastro = " + i_usuario.idSituacaoCadastro);
                sql.append(" WHERE id = " + i_usuario.id);

                stm.execute(sql.toString());


            } else {
                if (i_usuario.id == 0) {
                    i_usuario.id = Global.getCodigoInterno(Formulario.CADASTRO_USUARIO);
                }

                sql = new StringBuilder();
                sql.append("INSERT INTO usuario (id, login, nome, senha, id_situacaocadastro, datahoraultimoacesso)");
                sql.append(" VALUES (");
                sql.append(i_usuario.id + ", ");
                sql.append("'" + i_usuario.login + "', ");
                sql.append("'" + i_usuario.nome + "', ");
                sql.append("'" + i_usuario.senha + "', ");
                sql.append(i_usuario.idSituacaoCadastro + ", ");
                sql.append("NULL )");

                stm.execute(sql.toString());


            }

            //salvar permissao
            sql = new StringBuilder();
            sql.append("DELETE FROM permissao WHERE id_usuario = " + i_usuario.id + ";");

            for (PermissaoVO oPermissao : i_usuario.vPermissao) {
                if (oPermissao.selecionado) {
                    sql.append("INSERT INTO permissao (id_usuario, id_formulario, id_tipooperacao) VALUES (");
                    sql.append(i_usuario.id + ", ");
                    sql.append(oPermissao.idFormulario + ", ");
                    sql.append(oPermissao.idTipoOperacao + ");");
                }
            }

            stm.execute(sql.toString());

            stm.close();
            Conexao.commit();

        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public UsuarioVO carregarUsuario(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        //carrega usuario
        rst = stm.executeQuery("SELECT * FROM usuario WHERE id = " + i_id);

        if (!rst.next()) {
            throw new LBException("Usuário não encontrado!");
        }

        UsuarioVO oUsuario = new UsuarioVO();
        oUsuario.id = rst.getInt("id");
        oUsuario.login = rst.getString("login");
        oUsuario.nome = rst.getString("nome");
        oUsuario.senha = rst.getString("senha");
        oUsuario.idSituacaoCadastro = rst.getInt("id_situacaocadastro");

        //carregar permissao
        sql = new StringBuilder();
        sql.append("SELECT programa.descricao as programa,programa.id as id_programa,fo.id_formulario, formulario.descricao AS formulario, fo.id_tipooperacao, tipooperacao.descricao AS tipooperacao,");
        sql.append(" formulario.id_modulo, modulo.descricao AS modulo, (CASE WHEN permissao.id IS NULL THEN FALSE ELSE TRUE END) AS permissao");
        sql.append(" FROM formulariooperacao fo");
        sql.append(" INNER JOIN formulario ON formulario.id = fo.id_formulario");
        sql.append(" INNER JOIN tipooperacao ON tipooperacao.id = fo.id_tipooperacao");
        sql.append(" INNER JOIN modulo ON modulo.id = formulario.id_modulo");
        sql.append(" INNER JOIN programa ON programa.id = formulario.id_programa");
        sql.append(" LEFT JOIN permissao ON permissao.id_formulario = fo.id_formulario AND permissao.id_tipooperacao = fo.id_tipooperacao AND permissao.id_usuario = " + i_id);
        sql.append(" ORDER BY programa.descricao,modulo.descricao, formulario.descricao, tipooperacao.descricao");

        rst = stm.executeQuery(sql.toString());

        while (rst.next()) {
            PermissaoVO oPermissao = new PermissaoVO();
            oPermissao.programa = rst.getString("programa");
            oPermissao.idPrograma = rst.getInt("id_programa");
            oPermissao.formulario = rst.getString("formulario");
            oPermissao.idFormulario = rst.getInt("id_formulario");
            oPermissao.idTipoOperacao = rst.getInt("id_tipooperacao");
            oPermissao.tipoOperacao = rst.getString("tipooperacao");
            oPermissao.idModulo = rst.getInt("id_modulo");
            oPermissao.modulo = rst.getString("modulo");
            oPermissao.selecionado = rst.getBoolean("permissao");

            oUsuario.vPermissao.add(oPermissao);
        }

        stm.close();

        return oUsuario;
    }

    public Vector<PermissaoVO> carregarPermissao() throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT fo.id_formulario, formulario.descricao AS formulario, fo.id_tipooperacao,");
        sql.append(" tipooperacao.descricao AS tipooperacao, formulario.id_modulo, modulo.descricao AS modulo, formulario.id_programa,");
        sql.append(" programa.descricao AS programa");
        sql.append(" FROM formulariooperacao fo");
        sql.append(" INNER JOIN formulario ON formulario.id = fo.id_formulario");
        sql.append(" INNER JOIN tipooperacao ON tipooperacao.id = fo.id_tipooperacao");
        sql.append(" INNER JOIN modulo ON modulo.id = formulario.id_modulo");
        sql.append(" INNER JOIN programa ON programa.id = formulario.id_programa");
        sql.append(" ORDER BY programa.descricao, modulo.descricao, formulario.descricao, tipooperacao.descricao");

        rst = stm.executeQuery(sql.toString());

        Vector<PermissaoVO> vPermissao = new Vector();

        while (rst.next()) {
            PermissaoVO oPermissao = new PermissaoVO();
            oPermissao.formulario = rst.getString("formulario");
            oPermissao.idFormulario = rst.getInt("id_formulario");
            oPermissao.idTipoOperacao = rst.getInt("id_tipooperacao");
            oPermissao.tipoOperacao = rst.getString("tipooperacao");
            oPermissao.idPrograma = rst.getInt("id_programa");
            oPermissao.programa = rst.getString("programa");
            oPermissao.idModulo = rst.getInt("id_modulo");
            oPermissao.modulo = rst.getString("modulo");
            oPermissao.selecionado = false;

            vPermissao.add(oPermissao);
        }

        stm.close();

        return vPermissao;
    }

    public Vector<UsuarioVO> consultarUsuario(UsuarioFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT usuario.id, usuario.nome, usuario.login, usuario.senha, ");
        sql.append(" usuario.id_situacaocadastro, situacaocadastro.descricao AS situacaocadastro,");
        sql.append(" usuario.datahoraultimoacesso");
        sql.append(" FROM usuario");
        sql.append(" INNER JOIN situacaocadastro ON situacaocadastro.id = usuario.id_situacaocadastro");
        sql.append(" WHERE usuario.id > 0");

        if (i_filtro.idSituacaoCadastro != -1) {
            sql.append(" AND usuario.id_situacaocadastro = " + i_filtro.idSituacaoCadastro);
        }
        if (i_filtro.id > 0) {
            sql.append(" AND usuario.id = " + i_filtro.id);
        }

        if (!i_filtro.login.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("usuario.login", i_filtro.login));
        }

        if (!i_filtro.nome.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("usuario.nome", i_filtro.nome));
        }

        sql.append(" ORDER BY usuario.id");

        rst = stm.executeQuery(sql.toString());

        Vector<UsuarioVO> vUsuario = new Vector();

        while (rst.next()) {
            UsuarioVO oUsuario = new UsuarioVO();
            oUsuario.id = rst.getInt("id");

            oUsuario.login = rst.getString("login");
            oUsuario.nome = rst.getString("nome");
            oUsuario.situacaoCadastro = rst.getString("situacaocadastro");
            oUsuario.dataHoraUltimoAcesso = rst.getTimestamp("datahoraultimoacesso") == null ? "" : Util.formatDataHoraGUI(rst.getTimestamp("datahoraultimoacesso"));

            vUsuario.add(oUsuario);
        }

        stm.close();

        return vUsuario;
    }

    public void excluirUsuario(int i_id) throws Exception {
        Statement stm = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();

            stm.execute("UPDATE usuario SET id_situacaocadastro = " + Situacao.EXCLUIDO.getId() + " WHERE id = " + i_id);

            stm.close();
            Conexao.commit();

        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public Vector<ClienteVO> consultarCliente(ClienteFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        StringBuilder sql = null;
        ResultSet rst = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();

        sql.append("SELECT c.id, c.nome, c.endereco, m.descricao AS municipio, e.sigla AS estado, c.telefone, sc.descricao AS situacaocadastro");
        sql.append(" FROM cliente AS c");
        sql.append(" INNER JOIN municipio AS m ON m.id = c.id_cidade");
        sql.append(" INNER JOIN estado AS e ON e.id = c.id_estado");
        sql.append(" INNER JOIN situacaocadastro AS sc ON sc.id = c.id_situacaocadastro");
        sql.append(" WHERE 1 = 1");

        if (i_filtro.id > 0) {
            sql.append(" AND c.id = " + i_filtro.id);
        }

        if (i_filtro.idSituacaoCadastro != -1) {
            sql.append(" AND sc.id = " + i_filtro.idSituacaoCadastro);
        }

        if (!i_filtro.nome.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("c.nome", i_filtro.nome));
        }

        rst = stm.executeQuery(sql.toString());

        Vector<ClienteVO> vCliente = new Vector();
        while (rst.next()) {
            ClienteVO oCliente = new ClienteVO();
            oCliente.id = rst.getInt("id");
            oCliente.nome = rst.getString("nome");
            oCliente.endereco = rst.getString("endereco");
            oCliente.municipio = rst.getString("municipio");
            oCliente.estado = rst.getString("estado");
            oCliente.telefone = rst.getString("telefone");
            oCliente.situacao = rst.getString("situacaocadastro");

            vCliente.add(oCliente);
        }
        return vCliente;
    }

    public void excluirCliente(int i_id) throws Exception {
        Statement stm = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();

            stm.execute("UPDATE cliente SET id_situacaocadastro = " + Situacao.EXCLUIDO.getId() + " WHERE id = " + i_id);

            stm.close();
            Conexao.commit();

        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public void salvarCliente(ClienteVO i_cliente) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;


        stm = Conexao.createStatement();
        sql = new StringBuilder();

        sql.append("SELECT * FROM cliente WHERE id = " + i_cliente.id + " AND id > 0");
        rst = stm.executeQuery(sql.toString());

        if (rst.next()) {
            //Global.verificarPermissao(Formulario.BANHO, TipoOperacao.ALTERAR);
            sql = new StringBuilder();
            sql.append("UPDATE cliente SET");
            sql.append(" nome = '" + i_cliente.nome + "', ");
            sql.append("endereco = '" + i_cliente.endereco + "', ");
            sql.append("bairro = '" + i_cliente.bairro + "', ");
            sql.append("telefone = '" + i_cliente.telefone + "', ");
            sql.append("cnpj = '" + i_cliente.cnpj + "', ");
            sql.append("cpf = '" + i_cliente.cpf + "', ");
            sql.append("email = '" + i_cliente.email + "', ");
            sql.append("id_cidade = " + i_cliente.idMunicipio + ", ");
            sql.append("id_estado = " + i_cliente.idEstado + ", ");
            sql.append("id_situacaocadastro = " + i_cliente.idSituacao + ", ");
            sql.append("utilizainvoice = " + i_cliente.utilizaInvoice + ", ");
            sql.append("id_tipoinscricao = " + i_cliente.idTipoInscricao);
            sql.append(" WHERE id = " + i_cliente.id);

            stm.execute(sql.toString());
        } else {
            // Global.verificarPermissao(Formulario.BANHO, TipoOperacao.INCLUIR);
            sql = new StringBuilder();
            sql.append("INSERT INTO cliente (nome, endereco, bairro, telefone, cnpj, cpf, email, id_cidade, id_estado,");
            sql.append(" id_situacaocadastro, id_tipoinscricao, utilizainvoice) VALUES (");
            sql.append("'" + i_cliente.nome + "', ");
            sql.append("'" + i_cliente.endereco + "', ");
            sql.append("'" + i_cliente.bairro + "', ");
            sql.append("'" + i_cliente.telefone + "', ");
            sql.append("'" + i_cliente.cnpj + "', ");
            sql.append("'" + i_cliente.cpf + "', ");
            sql.append("'" + i_cliente.email + "', ");
            sql.append(i_cliente.idMunicipio + ", ");
            sql.append(i_cliente.idEstado + ", ");
            sql.append(i_cliente.idSituacao + ", ");
            sql.append(i_cliente.idTipoInscricao + ", ");
            sql.append(i_cliente.utilizaInvoice + ")");

            stm.execute(sql.toString());
        }
    }

    public boolean verificaCnpjCadastrado(int i_tipoInscricao, String i_cnpj) throws Exception {
        Statement stm = null;
        ResultSet rst = null;

        stm = Conexao.createStatement();

        if (i_tipoInscricao == TipoInscricao.FISICA.getId()) {
            rst = stm.executeQuery(" SELECT id FROM cliente WHERE cpf = '" + i_cnpj + "'");
        } else {
            rst = stm.executeQuery(" SELECT id FROM cliente WHERE cnpj = '" + i_cnpj + "'");
        }

        if (rst.next()) {
            return true;
        } else {
            return false;
        }
    }

    public ClienteVO carregarCliente(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append("SELECT * FROM cliente");

        rst = stm.executeQuery(sql.toString());

        if (!rst.next()) {
            throw new LBException("Fornecedor não encontrado!");
        }

        ClienteVO oCliente = new ClienteVO();
        oCliente.id = rst.getInt("id");
        oCliente.nome = rst.getString("nome");
        oCliente.bairro = rst.getString("bairro");
        oCliente.endereco = rst.getString("endereco");
        oCliente.telefone = rst.getString("telefone");
        oCliente.cnpj = rst.getString("cnpj");
        oCliente.cpf = rst.getString("cpf");
        oCliente.email = rst.getString("email");
        oCliente.idMunicipio = rst.getInt("id_cidade");
        oCliente.idEstado = rst.getInt("id_estado");
        oCliente.idSituacao = rst.getInt("id_situacaocadastro");
        oCliente.idTipoInscricao = rst.getInt("id_tipoinscricao");
        oCliente.utilizaInvoice = rst.getBoolean("utilizainvoice");

        return oCliente;
    }
}
